// node包util的promisify封装异步过程
const { promisify } = require("util");
const { log } = require("./print");

/**
 * @description 克隆仓库至本地
 * @param repo 仓库地址
 * @param dist 目标文件夹
 */
module.exports.clone = async function (repo, dist) {
  const download = promisify(require("download-git-repo"));
  const ora = require("ora");
  // 定制进度条
  const process = ora(`downloading from "${repo}"`);
  // 进度条开始
  process.start();
  // 执行真正的下载
  await download(repo, dist);
  // 下载完成后，进度条100%
  process.succeed();
  // 提示运行
  // log(`cd ${dist} & npm install`);
};

module.exports.spawn = async (...args) => {
  const { spawn } = require("child_process");
  // 目的：让主进程等待子进程的执行完成后再往下运行
  // promisify化：变成异步的
  return new Promise((resolve) => {
    // 创建子进程
    const proc = spawn(...args);
    // 子进程的成功流和错误流都插入到主进程：才会正常显示子进程的日志
    proc.stdout.pipe(process.stdout);
    proc.stderr.pipe(process.stderr);
    // 当子进程监听到close，就返回resolve状态
    proc.on("close", () => {
      resolve();
    });
  });
};
